import { toast as A } from 'vue3-toastify';
import type {
  NotificationType,
  PositionType,
  TransitionType,
  ThemeType,
} from '@/types/util';
import { API, IMAGE_URL } from '@/config';

export const toast = (
  title: string = '操作成功',
  type: NotificationType = 'success',
  position: PositionType = 'top-right',
  theme: ThemeType = 'light',
  transition: TransitionType = 'bounce',
  dangerouslyHTMLString: boolean = true,
) => {
  A(title, {
    theme,
    type,
    position,
    transition,
    dangerouslyHTMLString,
  });
};

/**
 * 验证是否是邮箱地址
 * @param email - 邮箱地址
 * @returns boolean
 */
export function isValidEmail(email: string): boolean {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

/**
 * 验证是否是手机号码
 * @param phone - 手机号码
 * @returns boolean
 */
export function isValidPhone(phone: string): boolean {
  const phoneRegex = /^1[3-9][0-9]{9}$/;
  return phoneRegex.test(phone);
}

/**
 * 生成uuid
 * @returns 返回uuid字符串
 */
export function uuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    var r = (Math.random() * 16) | 0,
      v = c == 'x' ? r : (r & 0x3) | 0x8;
    return v.toString(16);
  });
}

/**
 * 后端返回字符串转换成列表
 * @param str - 后端的字符串
 * @returns 返回以[,;，；]分割的列表
 */
export function strToArray(str: string): Array<string> {
  return str
    .split(/[,;，；]+/)
    .map(item => item.trim())
    .filter(item => item !== '');
}

/**
 * 统一给图片加上前缀
 * @param url - 图片地址，可以是有前缀和没前缀的
 * @param prefix - 图片前缀，默认是当前服务器地址
 * @returns 完整图片地址
 */
export function imgAddPrefix(url: string, prefix: string = IMAGE_URL): string {
  return url.startsWith('http') ? url : prefix + url;
}

/**
 * 给数字类型增加单位，例如1600转换成1.6k
 * @param num - 想要转换的数字
 * @returns 增加单位后的数字，如1.6k
 */
export function addUnits(num: number | string): string {
  const unit = typeof num === 'string' ? parseInt(num, 10) : num;

  if (unit >= 100000) {
    // 大于等于 100000 使用 'w' 单位
    return (unit / 10000).toFixed(1) + 'w';
  } else if (unit >= 10000) {
    // 大于等于 10000 使用 'w' 单位
    return (unit / 10000).toFixed(1) + 'w';
  } else if (unit >= 1000) {
    // 大于等于 1000 使用 'k' 单位
    return (unit / 1000).toFixed(1) + 'k';
  } else {
    // 小于 1000 不使用单位
    return unit.toString();
  }
}

/**
 * 格式化手机号或邮箱
 * @param contact - 手机号或邮箱
 * @returns 格式化后的字符串
 */
export function formatContact(contact: string): string {
  if (isValidPhone(contact)) {
    return contact.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2');
  } else if (isValidEmail(contact)) {
    const [localPart, domain] = contact.split('@');
    if (localPart.length > 3) {
      return `${localPart.slice(0, 3)}****@${domain}`;
    } else {
      return `${localPart}****@${domain}`;
    }
  } else return contact;
}

/**
 * 生成随机颜色
 * @returns 随机颜色的字符串表示，例如 #RRGGBB
 */
export function getRandomColor(): string {
  const letters = '0123456789ABCDEF';
  let color = '#';
  for (let i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}
